home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctj1086.arc
/
EGATEST.MOD
< prev
next >
Wrap
Text File
|
1986-08-15
|
14KB
|
384 lines
MODULE EGATest;
(*
Title : EGATest.mod
Enhanced Display Adapter Testing Program
LastEdit: July 22, 1986
Author : John T. Cockerham, M.D.
System : LOGITECH MODULA-2/86
*)
IMPORT Terminal;
IMPORT InOut;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM LowEGA IMPORT
InitEGA, SetUpAlpha, SetUpHiRes, Write, WriteString,
SetActivePage, TurnOnBlinking, TurnOffBlinking, MonitorType,
HorScrollRight, HorizScroll, ResetHorizScroll, VerticalScrollDown,
ResetVerticalScroll, SetCursorPoint, SetCursor, SetBiosPalette,
WaitForVerticalRetrace, SplitScreenAt, RollSplitScreenUp,
RollSplitScreenDown, SetPalette, SetOverscan, BiosCRTParams,
MakeSecondGraphicsPage, DrawPoint, SetBiosCursorPoint,
RowsOnScreen, BytesPerChar, EGABiosRec, BiosCRTVars, ActivePage,
FillGraphicsPage, GetCursorPoint, LoadBiosFont, SetModeBios,
GetAlternatePrintScreen,PrintScreen, FontType, SetActiveFonts,
TotalVerticalScanLines, MaxVideoPages, EGABiosParams, EGASavePtr,
MemoryInstalled, MemoryInstalled256K, WaitForVerticalDisplay;
FROM PointLib IMPORT Point, MakePoint, BumpPointY;
FROM FontBumper IMPORT SetUpFontBumping, ResetFontBumping;
FROM Conversions IMPORT ConvertCardinal;
FROM Strings IMPORT Insert;
FROM Pauses IMPORT Pause, GraphicsPause;
FROM DrawPoly IMPORT DrawLine, DrawBox;
FROM DotTime IMPORT DotTimingTest;
CONST Blank = 020H; (* An ASCII Blank *)
VIDEO = 010H; (* Bios video int *)
HiRes = 010H; (* Color Hi Res Mode *)
Alpha = 003H; (* Color Alpha Mode *)
Page0 = 0; Page1 = 1;
WaitingTime = 500;
PROCEDURE SayHello;
BEGIN
SetModeBios(Alpha); SetUpAlpha;
SetActivePage(Page1);
Pause('PC TECH JOURNAL EGA Testing Program');
Pause('by John T. Cockerham');
Pause('Portions copyright (c) Logitech Corporation, 1986');
Pause('Copyright (c) PC Tech Journal, 1986');
Pause('Aborting this program during Font Bumping...');
Pause('Will leave the EGA in an undefined state.');
END SayHello;
PROCEDURE CheckMemorySize() : BOOLEAN;
BEGIN
RETURN (MemoryInstalled = MemoryInstalled256K);
END CheckMemorySize;
PROCEDURE WaitAWhile;
VAR i : CARDINAL;
BEGIN
FOR i := 0 TO WaitingTime DO
WaitForVerticalRetrace;
WaitForVerticalDisplay;
END;
END WaitAWhile;
(* This routine makes a split screen in alpha mode *)
PROCEDURE MakeSplitScreen(NumberOfRows,NewPage,NewLine : CARDINAL);
VAR
Cursor : Point; Lines : CARDINAL;
BEGIN
Lines := NumberOfRows * BytesPerChar;
SetActivePage(NewPage); MakePoint(Cursor, 0, NewLine);
SetCursorPoint(ActivePage, Cursor);
RollSplitScreenUp(Lines);
END MakeSplitScreen;
PROCEDURE SplitAndScroll2Ways;
VAR i : CARDINAL;
BEGIN
Pause('Splitting and Scrolling 3 ways at a time');
FOR i := 0 TO 300 DO
(* Here scroll horizontally by one *)
HorScrollRight;
(* Here bring up one line on the split screen *)
SplitScreenAt(TotalVerticalScanLines - i);
(* Here scroll vertically by one line *)
VerticalScrollDown;
END;
WaitAWhile;
END SplitAndScroll2Ways;
PROCEDURE FillPage(PageNumber : CARDINAL);
VAR
j : INTEGER; CursorStart : Point;
BEGIN
SetActivePage(PageNumber); MakePoint(CursorStart, 0, 0);
SetCursorPoint(PageNumber, CursorStart);
FOR j := 0 TO (ORD(RowsOnScreen) + 1) * BiosCRTParams.CRTCols - 1
DO Write (PageNumber, CHR(ORD('0') + PageNumber), 3);
END;
END FillPage;
PROCEDURE FillAndSplitTest;
PROCEDURE SoftScrollTest(Page, Lines : CARDINAL);
VAR l : CARDINAL; p : Point;
BEGIN
SetActivePage(Page);
MakePoint(p, 10, 10); SetCursorPoint(ActivePage, p);
Pause('Vertical scrolling test');
l := 0;
WHILE l < Lines DO VerticalScrollDown; INC(l); END;
ResetVerticalScroll;
Pause('End vertical scrolling test');
END SoftScrollTest;
PROCEDURE SplitCursorTest;
VAR p : Point;
BEGIN
Pause('Split cursor test'); SetActivePage(ActivePage);
ResetHorizScroll; MakePoint (p, 0, 3);
SetCursorPoint(ActivePage, p); HorizScroll(4);
WaitAWhile;
ResetHorizScroll;
Pause('End split cursor test');
END SplitCursorTest;
PROCEDURE WriteCP(line : CARDINAL);
VAR s : ARRAY [0..15] OF CHAR;
p : Point; i, color : CARDINAL;
BEGIN
FOR i := 0 TO HIGH(s) DO s[i] := CHR(Blank); END;
MakePoint(p, 0, line); color := line + 2;
SetCursorPoint(ActivePage, p);
WriteString(ActivePage, ' Line ', color);
ConvertCardinal(line, 3, s);
WriteString(ActivePage, s, color);
END WriteCP;
(* Variables for the main routine *)
VAR i : INTEGER; p : Point;
BEGIN
SetActivePage(Page1);
Pause('Filling and Splitting Test');
(* Here fill all of the video pages with something *)
FOR i := 0 TO MaxVideoPages DO FillPage(i); END;
(* Test the soft scrolling in several ways *)
SoftScrollTest(4, 180);
Pause('Horizontal Pixel Pan to Left');
HorizScroll(280); Pause('Pixel pan to right');
HorizScroll(-280);
(* Fill up Page 0 with some other information *)
SetActivePage(Page0); FOR i := 0 TO 15 DO WriteCP(i); END;
(* Turn on the overscan to green *)
Pause('Turning on green border'); SetOverscan(2);
(* Scroll up the split screen with 4 lines of text *)
Pause('Bringing up Split Screen with 4 lines of text');
MakeSplitScreen(4, 3, 14); WaitAWhile;
Pause('Split Screen Test Complete');
(* Now torture the board doing everything at once *)
IF SetUpFontBumping(4) THEN
Pause('Font Bumping enabled at 4.5 times per second');
ELSE
Pause('Unable to set up Font Bumping');
END;
SplitAndScroll2Ways;
(* See what happens when the cursor split across 2 rows *)
SplitCursorTest; Pause('End of Fill and Split Test');
ResetFontBumping; Pause('Font bumping disabled');
END FillAndSplitTest;
PROCEDURE CycleTheFontsTest;
VAR i : CARDINAL; s, t : ARRAY [0..14] OF CHAR;
PROCEDURE DisplayEntireFont;
VAR p: Point;
BEGIN
SetActivePage(Page1);
MakePoint(p, 0, 0);
SetCursorPoint(ActivePage, p);
FOR i := 0 TO 255 DO Write(Page1, CHR(i), 5); END;
END DisplayEntireFont;
BEGIN
SetActiveFonts(0, 0);
DisplayEntireFont;
Insert('This is Font ', s, 0);
Pause('Cycling through the Active Fonts');
FOR i := 0 TO 3 DO
SetActiveFonts(i, i); ConvertCardinal(i, 2, t);
Insert(t, s, 13); Pause(s);
END;
END CycleTheFontsTest;
PROCEDURE Mode3GraphicsTest;
(* This routine tests the line graphics characters on the CRT*)
CONST
LLBoxCorner1 = 192; URBoxCorner1 = 191;
LRBoxCorner1 = 217; ULBoxCorner1 = 218;
VertLine1 = 179; HorizLine1 = 196;
LLBoxCorner2 = 200; URBoxCorner2 = 187;
LRBoxCorner2 = 188; ULBoxCorner2 = 201;
VertLine2 = 186; HorizLine2 = 205;
VAR i : CARDINAL;
PROCEDURE WriteCharAt(ch : CHAR; Row, Column, Color : CARDINAL);
VAR p: Point;
BEGIN
MakePoint(p, Column, Row); SetCursorPoint(ActivePage, p);
Write(ActivePage, ch, Color);
END WriteCharAt;
BEGIN
Pause('Text 80 Graphics Test');
SetActivePage(0);
WriteCharAt(CHR(ULBoxCorner1), 0, 0, 3);
FOR i := 1 TO 78 DO Write(ActivePage, CHR(HorizLine1), 3) END;
WriteCharAt(CHR(URBoxCorner1), 0, 79, 3);
WriteCharAt(CHR(LLBoxCorner1), 24, 0, 3);
FOR i := 1 TO 78 DO Write(ActivePage, CHR(HorizLine1), 3) END;
WriteCharAt(CHR(LRBoxCorner1), 24, 79, 3);
FOR i := 1 TO 23 DO
WriteCharAt(CHR(VertLine1), i, 0, 3);
WriteCharAt(CHR(VertLine1), i, 79, 3);
END;
WriteCharAt(CHR(ULBoxCorner2), 2, 2, 3);
FOR i := 3 TO 76 DO Write(ActivePage, CHR(HorizLine2), 3) END;
WriteCharAt(CHR(URBoxCorner2), 2, 77, 3);
WriteCharAt(CHR(LLBoxCorner2), 22, 2, 3);
FOR i := 3 TO 76 DO Write(ActivePage, CHR(HorizLine2), 3) END;
WriteCharAt(CHR(LRBoxCorner2), 22, 77, 3);
FOR i := 3 TO 21 DO
WriteCharAt(CHR(VertLine2), i, 2, 3);
WriteCharAt(CHR(VertLine2), i, 77, 3);
END;
WriteCharAt(CHR(206), 17, 14, 3);
Pause('End Monochrome character Graphics Test');
END Mode3GraphicsTest;
PROCEDURE Mode10GraphicsTest;
VAR
p1, p2 : Point;
BEGIN
Pause('Raster Graphics Test Starting');
DotTimingTest;
SetModeBios(Alpha); SetUpAlpha; Pause('Line and Fill Test ');
SetModeBios(HiRes); SetUpHiRes; SetActivePage(0);
MakePoint(p1, 0, 0); MakePoint(p2, 639, 349);
DrawBox(p1, p2, 14); MakePoint(p1, 1, 1);
MakePoint(p2, 638, 348); DrawBox(p1, p2, 5);
MakePoint(p1, 5, 5); MakePoint(p2, 600, 300);
DrawBox(p1, p2, 6);
GraphicsPause(Page0, 'Yellow Box Drawn at edge of screen');
TurnOnBlinking;
GraphicsPause(Page0, 'Blinking Test ongoing ');
TurnOffBlinking;
GraphicsPause(Page0, 'Recoloring Palettes 0 and 8 ');
SetPalette(8, 0); SetPalette(2, 18);
SetPalette(10, 36); TurnOnBlinking;
GraphicsPause(Page0, 'Second Blink Test. ');
TurnOffBlinking; MakeSecondGraphicsPage;
FillGraphicsPage(10); RollSplitScreenUp(110);
GraphicsPause(Page1, 'Double Yellow Line on Split Screen');
GraphicsPause(Page1, 'Turning Blinking On Again ');
TurnOnBlinking; FillGraphicsPage(8);
GraphicsPause(Page1, 'Ending Mode 10 Graphics Test ');
TurnOffBlinking; RollSplitScreenDown;
END Mode10GraphicsTest;
PROCEDURE FillPageTerm(s : ARRAY OF CHAR);
VAR i, NumberOfTimes : CARDINAL;
BEGIN
NumberOfTimes := 43 * 80 DIV HIGH(s);
FOR i := 1 TO NumberOfTimes DO
Terminal.WriteString(s); END;
END FillPageTerm;
PROCEDURE Check43x80Mode;
BEGIN
SetModeBios(03H);
LoadBiosFont(DoubleDotFont, TRUE, 0);
GetAlternatePrintScreen;
FillPageTerm(' PC Tech Journal EGA Test ');
PrintScreen;
SetUpAlpha; Pause('End 43 by 80 test');
END Check43x80Mode;
VAR NewSaveArea : RECORD
VideoParamsPointer : ADDRESS;
DynamicSavePointer : ADDRESS;
AlphaAuxilaryPtr : ADDRESS;
GraphicsAuxilaryPtr: ADDRESS;
Reserved5 : ADDRESS;
Reserved6 : ADDRESS;
Reserved7 : ADDRESS;
Reserved8 : ADDRESS;
END;
DynamicSaveArea : ARRAY [0..256] OF CHAR;
OldSaveAreaPtr : ADDRESS;
(* This routine checks out the save area functions of the BIOS
It firsts saves the old pointer, then it points to a new
table. A mode set is called, and one palette is changed. The
save area is then checked to make sure the change was passed
back to the save area. *)
PROCEDURE SaveAreaTest;
PROCEDURE DumpSaveArea;
PROCEDURE WritePal(index : CARDINAL; Pal : CHAR);
BEGIN
InOut.WriteString('Palette '); InOut.WriteCard(index, 3);
InOut.WriteString('. '); InOut.WriteHex(ORD(Pal), 2);
END WritePal;
VAR i : CARDINAL;
BEGIN
FOR i := 1 TO 3 DO InOut.WriteLn; END;
FOR i:= 0 TO 15 BY 2 DO
WritePal(i, DynamicSaveArea[i]);
InOut.WriteString(' ');
WritePal(i+1, DynamicSaveArea[i+1]);
InOut.WriteLn;
END;
InOut.WriteString('Overscan ');
InOut.WriteHex(ORD(DynamicSaveArea[16]),2);
InOut.WriteLn;
END DumpSaveArea;
BEGIN
SetModeBios(Alpha); SetUpAlpha; SetActivePage(Page1);
Pause('Save Area Test'); SetModeBios(Alpha);
OldSaveAreaPtr := EGASavePtr;
NewSaveArea.VideoParamsPointer := EGASavePtr^;
WITH NewSaveArea DO
DynamicSavePointer := ADR(DynamicSaveArea);
AlphaAuxilaryPtr := 0H:0H;
GraphicsAuxilaryPtr:= 0H:0H;
Reserved5 := 0H:0H;
Reserved6 := 0H:0H;
Reserved7 := 0H:0H;
Reserved8 := 0H:0H;
END;
(* Now set up the new pointer *)
EGASavePtr := ADR(NewSaveArea.VideoParamsPointer);
(* Issue a mode change call through the Bios *)
(* Now dump the palette stuff out on the console *)
SetModeBios(Alpha);
DumpSaveArea;
(* Change Palette 5 to something different *)
SetBiosPalette(5, 031H);
Terminal.WriteString('New Palette Value at 5');
Terminal.WriteLn;
DumpSaveArea;
EGASavePtr := OldSaveAreaPtr; SetUpAlpha;
Pause('Ending Save Area Test');
SetModeBios(Alpha); SetUpAlpha;
END SaveAreaTest;
BEGIN
IF InitEGA(Color) AND CheckMemorySize() THEN
SayHello;
FillAndSplitTest;
CycleTheFontsTest;
Mode3GraphicsTest;
Mode10GraphicsTest;
SaveAreaTest;
Check43x80Mode;
Pause('Finished');
SetModeBios(Alpha);
ELSE
SetModeBios(Alpha);
IF NOT CheckMemorySize() THEN
InOut.WriteString('Insufficient Graphics Ram for Test.');
ELSE
InOut.WriteString('Unknown Error During Initialization.');
END;
InOut.WriteLn;
END;
END EGATest.